// #include<iostream>
// #include<vector>
// using namespace std;
// int main()
// {
//     int n,V;
//     cin >> n >> V;
//     vector<vector<int>> dp(n+1,vector<int>(V+1,0));
//     vector<int> v(n+1);
//     vector<int> w(n+1);
//     for(int i=1;i<=n;i++)
//     {
//         cin >> v[i] >> w[i];
//     }
//     for(int i=1;i<=n;i++)
//     {
//         for(int j=0;j<=V;j++)
//         {
//             dp[i][j]=dp[i-1][j];
//             if(j>=v[i]){
//                 dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]);
//             }
//         }
//     }
//     cout << dp[n][V];
//     return 0;
// }

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int n,V;
    cin >> n >> V;
    vector<int> dp(V+1,0);
    vector<int> v(n+1);
    vector<int> w(n+1);
    for(int i=1;i<=n;i++)
    {
        cin >> v[i] >> w[i];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=V;j>=v[i];j--) //逆序，确保dp[j-v[i]]等价于dp[i-1][j-v[i]],如果正序则dp[j-v[i]]就变成了dp[i][j-v[i]],造成错误
        {
            dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
        }
    }
    cout << dp[V];
    return 0;
}